//
//  constant.h
//  LTLBMC
//
//  Created by GD Huang on 5/18/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#ifndef LTLBMC_constant_h
#define LTLBMC_constant_h

#include "ikind.h"
#include "fkind.h"
#include "enuminfo.h"
#include "astVisitor.h"
#include "OCamlObject.h"

namespace cilast {
    
    class astVisitor;
    
    class constant : public OCamlObject {
    public:
        
        virtual int accept(astVisitor*);
    };
    
    class CInt64 : public constant {
    public:    
        long long mint64;
        ikind mikind;
        char* mstr;
        
        int accept(astVisitor*);
    };
    
    class CStr : public constant {
    public:    
        char* mstr;
        
        int accept(astVisitor*);
    };
    
    class CWStr : public constant {
    public:    
        std::vector<long long> mint64s;
        
        int accept(astVisitor*);
    };
    
    class CChr : public constant {
    public:    
        char mchar;
        
        int accept(astVisitor*);
    };
    
    class CReal : public constant {
    public:    
        float mfloat;
        fkind mfkind;
        char* mstr;
        
        int accept(astVisitor*);
    };
    
    
    class CEnum : public constant {
    public:    
        exp* mexp;
        char* mstr;
        enuminfo* menuminfo;
        
        int accept(astVisitor*);
    };
    
}

#endif
